package interfaces.admin;
/**
 * @author  Jennifer Henry
 */

//import donnees.Donnees;
import java.util.*;

import donnees.*;
import engine.*;

public class ModelAdmin extends Observable {
	Donnees donnees;
	Ville ville;
	Troncon troncon;
	Route route;

	ArrayList<ObserverTroncon> observersTroncon = new ArrayList<ObserverTroncon>();
	ArrayList<ObserverRoute> observersRoute = new ArrayList<ObserverRoute>();
	ArrayList<ObserverVille> observersVille = new ArrayList<ObserverVille>();
	
    public ModelAdmin(Donnees _donnees) {
    	if (_donnees == null) {
    		donnees = new BouchonDonneesInterfaceAdmin();
			System.out.println("ModelAdmin utilise BouchonDonnees");
    	}
    	else {
            donnees = _donnees;
    	}
    }
	public Vector<String> getListeVilles () throws ExceptionAccesDonnees {
		return donnees.getListeVilles();
	}
	public Vector<String> getListeRoutes () throws ExceptionAccesDonnees {
		return donnees.getListeRoutes();
	}
	public Ville getVilleByName (String nom) throws ExceptionAccesDonnees {
		return donnees.getVille(nom);
	}
	public Ville createNewVilleEmpty (String nom) {
		return new Ville(nom);
	}
	public void createVille (Ville v) throws ExceptionCreationDonnees, ExceptionAccesDonnees, ExceptionMiseAjourDonnees {
		donnees.createVille(v);
	}
	public void supprimerVille (Ville v) throws ExceptionSuppressionDonnees {
		donnees.removeVille(v);
		// TODO observer
	}
	public void updateVille (Ville v) throws ExceptionMiseAjourDonnees {
		donnees.updateVille(v);
		// TODO observer
	}
	public Route getRouteByName (String nom) throws ExceptionAccesDonnees {
		return donnees.getRoute(nom);
	}
	public Route createNewRouteEmpty (String nom) {
		return new Route(nom);
	}
	public void createRoute (Route r) throws ExceptionCreationDonnees, ExceptionAccesDonnees, ExceptionMiseAjourDonnees {
		donnees.createRoute(r);
	}
	public void supprimerRoute (Route r) throws ExceptionSuppressionDonnees {
		donnees.removeRoute(r);
		// TODO observer
	}
	public void updateRoute (Route r) throws ExceptionMiseAjourDonnees {
		donnees.updateRoute(r);
		// TODO observer
	}
	public Troncon getTronconByName (String v1, String v2, String r) throws ExceptionAccesDonnees {
		return donnees.getTroncon(v1, v2, r);
	}
	public Troncon createNewTronconEmpty (Ville v1, Ville v2, Route r) throws ExceptionAccesDonnees {
		if (donnees.getTroncon(v1.getNom(), v2.getNom(), r.getNom()) != null) {
			return null;
		}
		return new Troncon(v1, v2, r.getNom());
	}
	public void createTroncon (Troncon t) throws ExceptionCreationDonnees, ExceptionAccesDonnees, ExceptionMiseAjourDonnees {
		donnees.createTroncon(t);
	}
	public void supprimerTroncon (Troncon t) throws ExceptionSuppressionDonnees {
		donnees.removeTroncon(t);
		// TODO observer
	}
	public void updateTroncon (Troncon t) throws ExceptionMiseAjourDonnees {
		donnees.updateTroncon(t);
		// TODO observer
	}
	
	public Route getRoute() {
		return route;
	}
	public void setRoute(Route _route) {
		route = _route;
	}
	public Troncon getTroncon() {
		return troncon;
	}
	public void setTroncon(Troncon _troncon) {
		troncon = _troncon;
	}
	public Ville getVille() {
		return ville;
	}
	public void setVille(Ville _ville) {
		ville = _ville;
	}
	// TODO updateFichierXML() + observer
	public void addObserverTroncon (ObserverTroncon o) {
		observersTroncon.add(o);
	}
	public void addObserverRoute (ObserverRoute o) {
		observersRoute.add(o);
	}
	public void addObserverVille (ObserverVille o) {
		observersVille.add(o);
	}
	public void notifyObserversTroncon () {
		for (ObserverTroncon o : observersTroncon) {
			o.update();
		}
	}
	public void notifyObserversVille () {
		for (ObserverVille o : observersVille) {
			o.update();
		}
	}
	public void notifyObserversRoute () {
		for (ObserverRoute o : observersRoute) {
			o.update();
		}
	}
}